#!/bin/sh

# This program will configure the makefile for various OSes.
#
# Config version 1.1

#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
SYS=

# Heading

cat > Makefile <<EoF
# Makefile for HEYU, a program to control an X10 CM11A computer interface.
# This makefile is generated by the Configure program.
#
EoF

# paths:
cat >> Makefile <<EoF
BIN = /usr/local/bin
MAN = /usr/local/man/man1
MAN5 = /usr/local/man/man5

#       set DFLAGS equal to:
#          -DSYSV       if using SYSTEM V
#          -DVOID       if compiler doesn't understand 'void'

EoF

CM17AFLAG="-DHASCM17A"
EXT0FLAG="-DHASEXT0"
RFXSENFLAG="-DHASRFXS"
RFXMETFLAG="-DHASRFXM"
DMXFLAG="-DHASDMX"
OREFLAG="-DHASORE"
KAKUFLAG="-DHASKAKU"

while [ $# -ge 1 ] ; do
    case "$1" in
	help|-h|-help)
	    echo "Usage: $0 <system type> [-nocm17a] [-noext0]"
	    echo " Valid system types are linux,sunos,solaris,opensolaris,opensolaris_bsd,"
	    echo " freebsd,openbsd,netbsd,darwin,sco,aix,sysv,attsvr4,nextstep,osf,generic"
	    echo " If no system type is specified, the output of uname(1) will be used."
            echo " Switch -nocm17a omits support for the optional CM17A Firecracker device." 
            echo " Switch -noext0 omits support for extended type 0 shutter controllers."
            echo " Switch -norfxs omits support for RFXSensors."
            echo " Switch -norfxm omits support for RFXMeters."
            echo " Switch -nodmx omits support for the Digimax thermostat."
            echo " Switch -noore omits support for Oregon sensors."
            echo " Switch -nokaku omits support for KaKu/HomeEasy signals"
            echo " Switch -flags=n sets the number of user flags (32 min, 1024 max)"
            echo " Switch -counters=n sets the number of counters (32 min, 1024 max)"
            echo " Switch -timers=n sets the number of timers (32 min, 1024 max)"
            echo " Above numbers are rounded up to the nearest multiple of 32"
	    rm Makefile 
	    exit
	    ;;
        nocm17a|-nocm17a|NOCM17A|-NOCM17A)
            CM17AFLAG=
            ;;
        noext0|-noext0|NOEXT0|-NOEXT0)
            EXT0FLAG=
            ;;
        norfxs|-norfxs|NORFXS|-NORFXS)
            RFXSENFLAG=
            ;;
        norfxm|-norfxm|NORFXM|-NORFXM)
            RFXMETFLAG=
            ;;
        nodmx|-nodmx|NODMX|-NODMX)
            DMXFLAG=
            ;;
        noore|-noore|NOORE|-NOORE)
            OREFLAG=
            ;;
        nokaku|-nokaku|NOKAKU|-NOKAKU)
            KAKUFLAG=
            ;;
	flags=*|-flags=*|FLAGS=*|-FLAGS=*)
	    IFS="${IFS}=" read keyword FLAGS <<EoF
$1
EoF
	    [ $FLAGS -ge 1 ] && [ $FLAGS -le 1024 ] || {
            	echo " Invalid flags argument, should be a number in the 1-1024 range"
	    	rm Makefile
		exit
	    }
	    FLAGS_FLAG="-DNUM_FLAG_BANKS=`expr \( $FLAGS + 31 \) / 32`"
	    ;;
	counters=*|-counters=*|COUNTERS=*|-COUNTERS=*)
	    IFS="${IFS}=" read keyword COUNTERS <<EoF
$1
EoF
	    [ $COUNTERS -ge 1 ] && [ $COUNTERS -le 1024 ] || {
            	echo " Invalid counters argument, should be a number in the 1-1024 range"
	    	rm Makefile
		exit
	    }
	    COUNTERS_FLAG="-DNUM_COUNTER_BANKS=`expr \( $COUNTERS + 31 \) / 32`"
	    ;;
	timers=*|-timers=*|TIMERS=*|-TIMERS=*)
	    IFS="${IFS}=" read keyword TIMERS <<EoF
$1
EoF
	    [ $TIMERS -ge 1 ] && [ $TIMERS -le 1024 ] || {
            	echo " Invalid timers argument, should be a number in the 1-1024 range"
	    	rm Makefile
		exit
	    }
	    TIMERS_FLAG="-DNUM_TIMER_BANKS=`expr \( $TIMERS + 31 \) / 32`"
	    ;;
	*)
	    SYS="$1"
	    ;;
    esac
    shift
done

cat <<EoF

This script will create a Makefile based by default on
the output of uname(1), or otherwise on the system type
parameter you enter.
 
EoF



if [ "$SYS" = "" ] ; then
    SYS=`uname -s | tr '[A-Z]' '[a-z]'`
fi

CC=gcc  #Set default for later

echo "#This makefile is built for $SYS" >> Makefile
case "$SYS" in
    linux)
        cat >> Makefile <<-EoF
	OWNER = root
	GROUP = root 
	CC = gcc
	CFLAGS = -g -O \$(DFLAGS) -Wall
	DFLAGS = -DSYSV -DPOSIX -DHAS_ITIMER -DLINUX -DHASTZ $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
	LIBS = -lm -lc
EoF
	;;
    sunos*|solaris)
    	type gcc > /dev/null
    	if [ $? = 0 ] ; then
    	    echo "CC = gcc" >> Makefile
            WALLFLAG=-Wall
	else
            CC=cc
	    echo "CC = cc" >> Makefile
            WALLFLAG=
	fi
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	DFLAGS = -DSYSV -DPOSIX -DSOLARIS -DLOCKDIR=\"/var/spool/locks\" -DHASSELECT -DHASTZ $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
	CFLAGS = -g -O \$(DFLAGS) \$WALLFLAG
	LIBS = -lm -lc -lrt
EoF
	;;
    opensolaris)
cat >> Makefile <<EoF
	BIN = /opt/heyu/bin
	MAN = /opt/heyu/man/man1
	MAN5 = /opt/heyu/man/man5
EoF
    	type gcc > /dev/null
    	if [ $? = 0 ] ; then
    	    echo "CC = gcc" >> Makefile
            WALLFLAG=-Wall
	else
            CC=cc
	    echo "CC = cc" >> Makefile
            WALLFLAG=
	fi
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	DFLAGS = -DSYSV -DPOSIX -DSOLARIS  -DSYSBASEDIR=\"/opt/heyu/etc\" -DLOCKDIR=\"/var/spool/locks\" -DHASSELECT -DHASTZ $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG
	CFLAGS = -g -O \$(DFLAGS) \$WALLFLAG
	LIBS = -lm -lc -lrt
EoF
	;;
    opensolaris_bsd)
    	type gcc > /dev/null
    	if [ $? = 0 ] ; then
    	    echo "CC = gcc" >> Makefile
            WALLFLAG=-Wall
	else
            CC=cc
	    echo "CC = cc" >> Makefile
            WALLFLAG=
	fi
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	DFLAGS = -DSYSV -DPOSIX -DSOLARIS -DLOCKDIR=\"/var/spool/locks\" -DHASSELECT -DHASTZ $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
	CFLAGS = -g -O \$(DFLAGS) \$WALLFLAG
	LIBS = -lm -lc -lrt
EoF
	;;
    freebsd)
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = wheel
	CC = gcc
	CFLAGS = -g -O \$(DFLAGS) -Wall
	LIBS = -lm -lc
	DFLAGS= -DPOSIX -DHASSELECT -DNEEDGTIME -DFREEBSD -DLOCKDIR=\"/var/spool/lock\" -DSYSBASEDIR=\"/usr/local/etc/heyu\" -DSPOOLDIR=\"/var/tmp/heyu\" $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
EoF
	;;
    openbsd)
        cat >> Makefile <<-EoF
	OWNER = root
	GROUP = wheel
	CC = gcc
	CFLAGS = -g -O \$(DFLAGS) -Wall
	LIBS = -lm -lc
	DFLAGS= -DPOSIX -DHASSELECT -DNEEDGTIME -DOPENBSD -DLOCKDIR=\"/var/spool/lock\" -DSYSBASEDIR=\"/etc/heyu\" -DSPOOLDIR=\"/var/tmp/heyu\" $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
EoF
       ;;
    netbsd)
	cat >> Makefile <<-EoF
	OWNER= root
	GROUP = wheel
	DFLAGS = -DPOSIX -DNETBSD -DHASSELECT -DLOCKDIR=\"/var/spool/lock\" $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
	CC = gcc
	CFLAGS = -g -O \$(DFLAGS) -Wall
	LIBS = -lm -lc
EoF
	;;
    darwin)
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = wheel
	DFLAGS = -DPOSIX -DDARWIN -DHASSELECT $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
	CC = gcc
	CFLAGS = -g -O \$(DFLAGS) -Wall
	LIBS = -lm -lc
EoF
	;;
    sco*)
        CC=cc
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	CC = cc
	MAN = /usr/local/man/man.1
	MAN5 = /usr/local/man/man.5
	CFLAGS = -O \$(DFLAGS)
	LIBS = -lm -lc -lsocket
	DFLAGS= -DSYSV -DHASSELECT -DSCO -DLOCKDIR=\"/var/spool/locks\" -DSPOOLDIR=\"/usr/tmp/heyu\" $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
EoF
	;;
    aix|sysv)
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	CC = gcc
	CFLAGS = -g -O \$(DFLAGS) -Wall
	LIBS = -lm -lc
	DFLAGS = -DSYSV -DPOSIX -DNSLEEP $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
EoF
	;;
    attsvr4)
        CC=cc
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	CC = cc
	CFLAGS = -I/usr/local/include -g -O \$(DFLAGS)
	LIBS = -lc -L/usr/ucblib -lucb -lm -lgen -lcmd
	DFLAGS = -DATTSVR4 -DHASTZ -DSYSV -DPOSIX -DLOCKDIR=\"/var/spool/locks\" -DSPOOLDIR=\"/var/spool/heyu\" -DSYSBASEDIR=\"/usr/local/etc/heyu\" $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
EoF
	;;
    nextstep)
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	CC = gcc
	DFLAGS =  -DPOSIX $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
	CFLAGS = -g \$(DFLAGS) -posix
	LDFLAGS = -posix
	LIBS = -lm -lposix
EoF
	;;
    osf)
	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = uucp
	CC = gcc
	CFLAGS = -g \$(DFLAGS)
	LIBS = -lm -lc
	DFLAGS = -DSYSV -DHAS_ITIMER -DOSF1 -DLOCKDIR=\"/var/spool/locks\" $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
EoF
      ;;
    generic)
    	cat >> Makefile <<-EoF
	OWNER = root
	GROUP = sys
	CC = gcc
	CFLAGS = -g -O \$(DFLAGS) -Wall
	LIBS = -lm -lc
	DFLAGS=  $CM17AFLAG $EXT0FLAG $RFXSENFLAG $RFXMETFLAG $DMXFLAG $OREFLAG $KAKUFLAG $FLAGS_FLAG $TIMERS_FLAG $COUNTERS_FLAG
EoF
	;;
    *)
    	echo "Your system type was not understood.  Please try one of "
    	echo "the following".
    	$0 -help
    	exit
    	;;
esac

# echo "checking for unsigned long long variable type"

rm -f local.h

rm -f testull.c testull
cat > testull.c <<EoF
int main()
{
   unsigned long long x;
   x=1;
   return 0;
}
EoF
$CC -o testull testull.c  >/dev/null 2>&1
if [ $? = 0 ] ; then
    echo "#define HASULL" >> local.h
#    echo "Has unsigned long long"
# else
#   echo "Does not have unsigned long long"
fi
rm -f testull.c testull

# echo "checking for siginterrupt()"

rm -f testsigi.c testsigi
cat > testsigi.c <<EoF
#include <signal.h>
int main()
{
   int x;
   x=siginterrupt(SIGALRM,1);
   return 0;
}
EoF
$CC -o testsigi testsigi.c  >/dev/null 2>&1
if [ $? = 0 ] ; then
    echo "#define HASSIGINT" >> local.h
#    echo "Using siginterrupt()"
# else
#   echo "Not using siginterrupt()"
fi
rm -f testsigi.c testsigi


# echo "checking for sigaction()"

rm -f testsiga.c testsiga
cat > testsiga.c <<EoF
#include <signal.h>
int main()
{
   int x;
   struct sigaction act, old;
   x=sigaction(SIGALRM, &act, &old);
   return 0;
}
EoF
$CC -o testsiga testsiga.c  >/dev/null 2>&1
if [ $? = 0 ] ; then
    echo "#define HASSIGACT" >>local.h
#    echo "Using sigaction()"
# else
#    echo "Not using sigaction()"
fi
rm -f testsiga.c testsiga

if [ ! -f local.h ] ; then
    touch local.h
fi


cat >> Makefile <<EoF
# # The rest of the makefile should need no changes

EoF

cat Makefile.in >> Makefile

if [ "$SYS" = "sysv" ] ; then
echo "The Makefile has been created for sysv, however if"
echo "you are running under AT&T SysV r4, please re-run"
echo "Configure with the system type parameter attsvr4"
else
echo "The Makefile has been created for $SYS."
fi
if [ "$SYS" = "opensolaris" ] ; then
echo "Please see \"Notes for OpenSolaris\" in file INSTALL before proceeding."
echo
fi

echo ""
echo "Note: If you are upgrading from an earlier version,"
echo "run 'heyu stop' before proceeding further."
echo ""
echo "** Now run 'make' as a normal user **"
echo ""
